package com.hxm.appGenealogy.config.aop;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

/**
 * 创建一个切面类;
 */
@Slf4j
@Aspect
@Component
public class LogAspect {

    /**
     * 切入点;
     * @Pointcut 切入点，其中execution用于使用切面的连接点。使用方法：execution(方法修饰符(可选) 返回类型 方法名 参数 异常模式(可选)) ，
     * 可以使用通配符匹配字符，*可以匹配任意字符。
     */
    @Pointcut("execution(public * com.hxm.appGenealogy.controller.TreeController.*(..))")
    public void LogAspect(){

    }
    /**
     * 在方法之前执行;
     * @param joinPoint
     *//*
    @Before("LogAspect()")
    public void doBefore(JoinPoint joinPoint){
        log.info("aop请求增强------------>");
        log.info("666目标类名为:" + joinPoint.getSignature().getDeclaringType().getSimpleName());
        log.info("666目标方法名为:" + joinPoint.getSignature().getName());
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            log.info("请求参数"+arg);
        }
    }
*/
    /*@After("LogAspect()")
    public void doAfter(JoinPoint joinPoint){
        System.out.println("aop响应增强--------->");
        Object[] args = joinPoint.getArgs();
       *//* for (Object arg : args) {
            System.out.println("响应参数数据数据=》"+arg);
        }*//*
    }*/
    /**
     * 环绕通知
     */
    @Around(value = "LogAspect()")
    public Object webLogAround(ProceedingJoinPoint joinPoint) throws Throwable {
        // className的值：com.gongj.test.controller.UserController
        String className = joinPoint.getTarget().getClass().getName();
        MethodSignature signature = (MethodSignature)joinPoint.getSignature();
        // 方法名称示例：test.controller.UserController.getUser():
        String methodName = new StringBuffer(className.replaceFirst("test.", ""))
                .append(".")
                .append(signature.getMethod().getName())
                .append("():").toString();
        log.info("==========> {} 方法原始报文:{}",methodName, JSON.toJSONString(joinPoint.getArgs()));
        Object proceed = joinPoint.proceed();
        log.info("==========> {} 方法响应报文:{}",methodName,JSON.toJSONString(proceed));
        return proceed;
    }

}
